package com.luoke.service.response.impl;

import cn.hutool.json.JSONUtil;
import com.luoke.connect.GameWebSocketClient;
import com.luoke.constants.ModuleTypeConstant;
import com.luoke.constants.StatusConstant;
import com.luoke.constants.SubmoduleTypeConstant;
import com.luoke.context.UserContext;
import com.luoke.handler.request.BattleRequestHandler;
import com.luoke.pojo.dto.InitiateBattleDTO;
import com.luoke.pojo.dto.PetChooseDTO;
import com.luoke.service.response.BattleResponseService;
import com.luoke.manage.threadmanage.FutureManager;
import com.luoke.result.Result;

import java.util.Scanner;


/**
 * 战斗响应服务层
 */
public class BattleResponseServiceImpl implements BattleResponseService {
    /**
     * 展示服务端返回的当前在线玩家
     *
     * @param gameWebSocketClient 使用该对象与服务端通信
     * @param result              服务端返回的结果
     */
    @Override
    public void showUserOnlineName(GameWebSocketClient gameWebSocketClient, Result result) {
        showAllUser(gameWebSocketClient, result);
    }

    /**
     * 对服务端响应的对方玩家是否接受战斗的消息进行处理
     *
     * @param gameWebSocketClient 使用该对象与服务端通信
     * @param result              服务端返回的结果
     */
    @Override
    public void battleRequest(GameWebSocketClient gameWebSocketClient, Result result) {
        result.setData(JSONUtil.toBean(result.getData().toString(), InitiateBattleDTO.class));
        InitiateBattleDTO data = (InitiateBattleDTO) result.getData();
        if (result.getStatus().equals(StatusConstant.SUCCESS)) {

//            //同意邀请的回调
//            if (data.getIsMatch()){  //判断是否是从匹配入口进入的  如果是的话，，必须要到匹配处理方法  进行异步的回调
//                matchBattle(gameWebSocketClient,result);
//            }else {
//
//            }
            FutureManager.completeFuture(UserContext.getCurrentUser(), StatusConstant.SUCCESS); //异步任务完成，让在其他等待的程序继续运行


        } else if (result.getStatus().equals(StatusConstant.FAIL)) {
            //拒绝邀请的回调
//            if (data.getIsMatch()!=null){
//                matchBattle(gameWebSocketClient,result);
//            }else {
//
//            }
            FutureManager.completeFuture(UserContext.getCurrentUser(), StatusConstant.FAIL);


        } else if (result.getStatus().equals(StatusConstant.NO_WAIT)) {
            //等待区中不存在该用户的回调
            FutureManager.completeFuture(UserContext.getCurrentUser(), StatusConstant.NO_WAIT);
        }
    }


    /**
     * 展示服务端返回的在等待区中的玩家
     *
     * @param gameWebSocketClient 使用该对象与服务端通信
     * @param result              服务端返回的结果
     */
    @Override
    public void showWaitForUser(GameWebSocketClient gameWebSocketClient, Result result) {
        showAllUser(gameWebSocketClient, result);
    }


    /**
     * 展示所有在线用户/等待区用户的封装方法
     *
     * @param gameWebSocketClient 使用该对象与服务端通信
     * @param result              服务端返回的结果
     */
    public void showAllUser(GameWebSocketClient gameWebSocketClient, Result result) {
        if (result.getStatus().equals(StatusConstant.SUCCESS)) {
            //成功则显示当前玩家
            System.out.println(result.getData().toString());
            //完成 Future，让在其他等待的程序继续运行
            FutureManager.completeFuture(UserContext.getCurrentUser(), null);
        }
    }


    /**
     * 当玩家进入等待区后，这里实时更新服务端的响应
     *
     * @param gameWebSocketClient 使用该对象与服务端通信
     * @param result              服务端返回的结果
     */
    @Override
    public void acceptBattleRequest(GameWebSocketClient gameWebSocketClient, Result result) {
        //这里要处理的是服务端发来战斗请求
        result.setData(JSONUtil.toBean(result.getData().toString(), InitiateBattleDTO.class));
        InitiateBattleDTO data = (InitiateBattleDTO) result.getData();
//        if (data.getIsMatch()){  //这里判断是否是从匹配入口进入的
////            String initiatorName = data.getInitiatorName();
//
////            data.setInitiatorName(initiatorName+"-true");
//        }
        FutureManager.completeFuture(UserContext.getCurrentUser(), data);//异步任务完成，把发起人交给回调方法处理
    }

    /**
     * 这里处理的是服务端发来的与匹配相关的请求
     *
     * @param gameWebSocketClient 使用该对象与服务端通信
     * @param result              服务端返回的结果
     */
    @Override
    public void matchBattle(GameWebSocketClient gameWebSocketClient, Result result) {
        result.setData(JSONUtil.toBean(result.getData().toString(), InitiateBattleDTO.class));
        InitiateBattleDTO data = (InitiateBattleDTO) result.getData();
        if (result.getStatus().equals(StatusConstant.SUCCESS)) {
            FutureManager.completeFuture(UserContext.getCurrentUser(), data.getOpponentName()); //传入的是匹配到的名字
        } else if (result.getStatus().equals(StatusConstant.FAIL)) {
            FutureManager.completeFuture(UserContext.getCurrentUser(), null);
        }

    }

    /**
     * 当服务端通知对手回合结束时调用
     *
     * @param gameWebSocketClient 使用该对象与服务端通信
     * @param result              服务端返回的结果
     */
    @Override
    public void opponentRoundCompleted(GameWebSocketClient gameWebSocketClient, Result result) {

        //回合结束的时候要先展示服务端计算之后的数据
        System.out.println(result.getMessage());
        System.out.println("对手完成了回合");
        //解除等待
        FutureManager.completeFuture(UserContext.getCurrentUser(), null);  // 唤醒自己的回合

    }

    /**
     * 展示对战中所有携带的宠物
     * @param gameWebSocketClient 使用该对象与服务端通信
     * @param result              服务端返回的结果
     */
    @Override
    public void showUserPetInfo(GameWebSocketClient gameWebSocketClient, Result result) {
        result.setData(JSONUtil.toBean(result.getData().toString(), InitiateBattleDTO.class));
        InitiateBattleDTO data = (InitiateBattleDTO) result.getData();
        System.out.println("请选择你要出战的宠物的序号:"+result.getMessage());
        String pet;
        Scanner scanner = new Scanner(System.in);
        while (true){
            pet = scanner.nextLine();
            if (pet.equals("1")||pet.equals("2")||pet.equals("3")||pet.equals("4")||pet.equals("5")||pet.equals("6")){
                break;
            }
            else {
                System.out.println("输入错误,请输入对应的宠物编号");
            }
        }
        //把选择的请求发送给服务端
        Result request = new Result();
        request.setModuleName(ModuleTypeConstant.BATTLE_ROUND);
        request.setCommand(SubmoduleTypeConstant.PET_CHOOSE);
        request.setData(new PetChooseDTO(data.getInitiatorName(),data.getOpponentName(),UserContext.getCurrentUser(),pet));
        gameWebSocketClient.send(JSONUtil.toJsonStr(request));
    }

    /**
     * 在对战中逃跑的情况处理
     * @param gameWebSocketClient
     * @param result
     */
    @Override
    public void battleQuit(GameWebSocketClient gameWebSocketClient, Result result) {
        System.out.println(result.getMessage());
        new BattleRequestHandler().showGameMenu(gameWebSocketClient);
    }

    @Override
    public void experienceResponse(GameWebSocketClient gameWebSocketClient, Result result) {
        System.out.println(result.getMessage());
        FutureManager.completeFuture(UserContext.getCurrentUser(), null);
    }
}
